0917. 仅仅反转字母【简单】
1. 📝 题目描述
给你一个字符串 s,根据下述规则反转字符串:
- 所有非英文字母保留在原有位置。
- 所有英文字母(小写或大写)位置反转。
返回反转后的 s。
示例 1:
txt
输入:s = "ab-cd"
输出:"dc-ba"1
2
2
示例 2:
txt
输入:s = "a-bC-dEf-ghIj"
输出:"j-Ih-gfE-dCba"1
2
2
示例 3:
txt
输入:s = "Test1ng-Leet=code-Q!"
输出:"Qedo1ct-eeLg=ntse-T!"1
2
2
提示:
1 <= s.length <= 100s仅由 ASCII 值在范围[33, 122]的字符组成s不含'\"'或'\\'
2. 🎯 s.1 - 双指针
js
/**
* @param {string} s
* @return {string}
*/
var reverseOnlyLetters = function (s) {
const arr = s.split('')
let l = 0
let r = arr.length - 1
// 判断是否为字母的辅助函数
const isLetter = (ch) => (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')
while (l < r) {
// 跳过非字母字符
if (!isLetter(arr[l])) {
l++
continue
}
if (!isLetter(arr[r])) {
r--
continue
}
// 字母字符交换
const t = arr[l]
arr[l] = arr[r]
arr[r] = t
l++
r--
}
return arr.join('')
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
- 时间复杂度:
,双指针线性遍历一次字符串 - 空间复杂度:
,用于字符数组与结果构建
算法思路:
- 使用两端指针
l、r,分别向内移动 - 遇到非字母字符跳过(保留原位);仅当两端均为字母时交换
- 字母判断可用区间比较(
A-Z、a-z),避免误判其它符号 - 过程不改变非字母位置,相当于只反转字母子序列